function isPlainObject(obj) {
	return obj
		? typeof obj === "object" && Object.getPrototypeOf(obj) === Object.prototype
		: false;
}

function handleProperties(sourceProperties, mergeProperties) {
	if (!isPlainObject(mergeProperties)) {
		return mergeProperties;
	}
	if (!isPlainObject(sourceProperties)) {
		return mergeProperties;
	}
	Object.keys(mergeProperties).forEach(key => {
		mergeProperties[key] = handleSchema(
			sourceProperties[key],
			mergeProperties[key]
		);
	});
	return mergeProperties;
}

function handleSchema(source, merge) {
	if (!isPlainObject(source)) return merge;
	if (!isPlainObject(merge)) return merge;
	let result = {};
	Object.assign(result, source, merge);
	if (merge.type === "object") {
		result.properties = handleProperties(source.properties, merge.properties);
	} else if (merge.type === "array") {
		result.items = handleSchema(source.items, merge.items);
	}
	return result;
}

module.exports = function (sourceJsonSchema, mergeJsonSchema) {
	return handleSchema(sourceJsonSchema, mergeJsonSchema);
};
